home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 6
/
FM Towns Free Software Collection 6.iso
/
t_os
/
et
/
src
/
list.c
< prev
next >
Wrap
Text File
|
1993-07-08
|
13KB
|
523 lines
#include "et.h"
int make_menu_list()/*et*/
{
int i, j, k, n, menu_n;
NAME *Name, *(*func)();
set_icn_name(G_mn[mn_ICN].name);
for (k = 2; k; k--) {
switch(k) {
case 2:
G_nb.mn = 0;
func = set_nb_name;
break;
case 1:
menu_n = G_nb.mn;
Name = G_mn[mn_LOGO].name;
func = set_name_p;
break;
}
for (i = 0; G_mn[i].s; i++) {
switch(k) {
case 2:
G_nb.mn++;
break;
case 1:
if (i != mn_LOGO && i != mn_ICN)
G_mn[i].name = Name;
break;
}
switch(i) {
case mn_ERR_1:
Name = func(Name, mn_ERR);
break;
case mn_ERR_2:
Name = func(Name, mn_ERR);
break;
case mn_ERR_3:
G_mn[mn_ERR].p += 120;
Name = func(Name, mn_ERR);
G_mn[mn_ERR].p -= 120;
break;
case mn_ERR_4:
Name = func(Name, mn_ERR);
break;
case mn_LOGO:
if (k == 2) {
Name = func(Name, mn_DEMO);
Name = func(Name, mn_MAKE);
Name = func(Name, mn_REPLAY);
Name = func(Name, mn_START);
Name = func(Name, mn_END);
} else
Name = set_start_name(Name);
break;
case mn_ESC:/* "終了" */
case mn_S_ESC:/* "終了" */
Name = func(Name, mn_END_RET);
Name = func(Name, mn_END_ESC);
break;
case mn_SS: /* "S 保存" */
case mn_LL: /* "L 読込" */
case mn_CC: /* "C カーソル" */
case mn_EE: /* "E 登録" */
for (j = 1; G_mn[j].s; j++)
switch(j) {
case mn_ESC:
case mn_UP:
case mn_LT:
case mn_DN:
case mn_RT:
case mn_BS:
case mn_RET:
case mn_C_MM:
case mn_S_RET:
case mn_C_EE:
case mn_C_DD:
case mn_C_SS:
case mn_C_XX:
Name = func(Name, j);
break;
}
if (k == 2)
Name = func(Name, j);
else {
_copy_buf(Name, G_mn[mn_ICN].name, sizeof(NAME));
Name++;
}
break;
case mn_FF: /* "F フォント" */
for (j = 1; G_mn[j].s; j++)
switch(j) {
case mn_ESC:
case mn_BS:
case mn_S_BS:
case mn_UP:
case mn_LT:
case mn_DN:
case mn_RT:
case mn_S_UP:
case mn_S_LT:
case mn_S_DN:
case mn_S_RT:
case mn_S_FR:
case mn_S_BK:
case mn_0:
case mn_1:
case mn_2:
case mn_3:
case mn_4:
case mn_5:
case mn_6:
case mn_7:
case mn_8:
case mn_9:
case mn_A:
case mn_B:
case mn_C:
case mn_D:
case mn_E:
case mn_F:
case mn_RET:
case mn_C_MM:
case mn_S_RET:
Name = func(Name, j);
break;
}
Name = func(Name, mn_MN_FF);
break;
case mn_AA: /* "A 動画" */
case mn_NN: /* "N 反転" */
case mn_OO: /* "O 標準" */
for (j = 1; G_mn[j].s; j++)
switch(j) {
case mn_ESC:
case mn_RET:
case mn_C_MM:
Name = func(Name, j);
break;
}
break;
case mn_PP: /* "P 遠近" */
case mn_DD: /* "D 距離" */
case mn_XX: /* "X 横幅" */
case mn_YY: /* "Y 縦幅" */
case mn_ZZ: /* "Z 奥幅" */
case mn_GG: /* "G 角度" */
for (j = 1; G_mn[j].s; j++)
switch(j) {
case mn_ESC:
case mn_BS:
case mn_S_BS:
case mn_PP:
case mn_DD:
case mn_XX:
case mn_YY:
case mn_ZZ:
case mn_GG:
case mn_UP:
case mn_DN:
case mn_RET:
case mn_C_MM:
case mn_S_RET:
case mn_00:
case mn_11:
case mn_22:
case mn_33:
case mn_44:
case mn_55:
case mn_66:
case mn_77:
case mn_88:
case mn_99:
case mn_LT_CC:
case mn_RT_CC:
if (i != j)
Name = func(Name, j);
break;
}
Name = func(Name, mn_MN_CC);
break;
case mn_BAR: /* " 描画" */
for (j = 1; G_mn[j].s; j++)
switch(j) {
case mn_ESC:
case mn_RET:
case mn_C_MM:
Name = func(Name, j);
break;
}
break;
case mn_TT: /* "T TRIPHONY" */
for (j = 1; G_mn[j].s; j++)
switch(j) {
case mn_ESC:
case mn_RET:
case mn_C_MM:
case mn_S_RET:
case mn_DISK:
case mn_LT_TT:
case mn_RT_TT:
case mn_UP_TT:
case mn_DN_TT:
Name = func(Name, j);
break;
}
Name = func(Name, mn_MN_TT);
break;
case mn_AT: /* " @ 補間" */
case mn_WW: /* " W 視差" */
for (j = 1; G_mn[j].s; j++)
switch(j) {
case mn_ESC:
case mn_BS:
case mn_RET:
case mn_C_MM:
case mn_S_RET:
case mn_00:
case mn_11:
case mn_22:
case mn_33:
case mn_44:
case mn_55:
case mn_66:
case mn_77:
case mn_88:
case mn_99:
case mn_LT_CC:
case mn_RT_CC:
Name = func(Name, j);
break;
}
Name = func(Name, mn_MN_CC);
break;
case mn_MN_AA: /* "A 動画" && !"DEL 消去" && !f_AREA */
case mn_MN_NN: /* "N 反転" && !"DEL 消去" && !f_AREA */
case mn_MN_OO: /* "O 標準" && !"DEL 消去" && !f_AREA */
for (j = 1; G_mn[j].s; j++)
switch(j) {
case mn_END_RET:
case mn_END_ESC:
case mn_C_XX:
case mn_C_SS:
case mn_C_EE:
case mn_C_DD:
case mn_RET:
case mn_C_MM:
case mn_S_RET:
case mn_AT:/**/
case mn_JJ:/**/
case mn_HH:/**/
break;
default:
if (j < mn_FREE_AREA && j != (mn_AA + i-mn_MN_AA))
Name = func(Name, j);
break;
}
break;
case mn_MN_DEL_AA: /* "A 動画" && "DEL 消去" */
case mn_MN_DEL_NN: /* "N 反転" && "DEL 消去" */
case mn_MN_DEL_OO: /* "O 標準" && "DEL 消去" */
for (j = 1; G_mn[j].s; j++)
switch(j) {
case mn_END_RET:
case mn_END_ESC:
case mn_C_XX:
case mn_C_SS:
case mn_C_EE:
case mn_C_DD:
case mn_BS:
case mn_S_BS:
case mn_SS:
case mn_EE:
case mn_S_EE:
case mn_RET:
case mn_C_MM:
case mn_S_RET:
case mn_AT:/**/
case mn_JJ:/**/
case mn_HH:/**/
break;
default:
if (j < mn_FREE_AREA && j != (mn_AA + i-mn_MN_DEL_AA))
Name = func(Name, j);
break;
}
break;
case mn_MN_AREA_AA: /* "A 動画" && f_AREA */
case mn_MN_AREA_NN: /* "N 反転" && f_AREA */
case mn_MN_AREA_OO: /* "O 標準" && f_AREA */
for (j = 1; G_mn[j].s; j++)
switch(j) {
case mn_END_RET:
case mn_END_ESC:
case mn_C_XX:
case mn_C_SS:
case mn_C_EE:
case mn_C_DD:
case mn_FF:
case mn_UP:
case mn_LT:
case mn_FR:
case mn_S_UP:
case mn_S_LT:
case mn_S_FR:
case mn_DN:
case mn_RT:
case mn_BK:
case mn_S_DN:
case mn_S_RT:
case mn_S_BK:
case mn_TAB:
case mn_INS:
case mn_C_UP:
case mn_C_LT:
case mn_C_FR:
case mn_RET:
case mn_C_MM:
case mn_S_RET:
case mn_C_DN:
case mn_C_RT:
case mn_C_BK:
case mn_AT:/**/
case mn_JJ:/**/
case mn_HH:/**/
break;
default:
if (j < mn_FREE_AREA && j != (mn_AA + i-mn_MN_AREA_AA))
Name = func(Name, j);
break;
}
break;
}
if (k == 1) {
Name->next = 0;
Name++;
}
}
}
return(menu_n);
}
NAME *set_start_name(NAME *Name)/*et*/
{
FILE *File;
unsigned f;
Name = set_name_p(Name, mn_DEMO);
if (G_nb.current != 16 && _disk_free(1)) {
File = fopen(P_c[c_FILE_REPLAY], "rb");
if (G_nb.current != 16 && !File)
Name = set_name_p(Name, mn_MAKE);
if (G_nb.current == 16 || !File) {
if (File)
fclose(File);
} else {
if (File) {
fread(&f, sizeof(unsigned), 1, File);
fclose(File);
} else
f = 0;
if (f == f_REPLAY)
Name = set_name_p(Name, mn_REPLAY);
}
if (G_nb.current != 16)
Name = set_name_p(Name, mn_START);
Name = set_name_p(Name, mn_END);
}
return(Name);
}
void set_icn_name(NAME *Name)/*et*/
{
int i;
for (i = 0; i < MAX_ICN+1; i++)
Name = set_icn_namep(Name, i);
Name->next = NULL;
}
NAME *set_icn_namep(NAME *Name, int file_i)/*et*/
{
int p_i, q_i;
p_i = file_i % 8;
q_i = file_i / 8;
Name->key = ICN_I + file_i;
Name->n = mn_ICN;
Name->pq[0] = P_i[i_WIN_VIEW][0] + P_i[i_SIZE_ICN][2] * 8 * p_i+1;
Name->pq[1] = P_i[i_WIN_VIEW][1] + P_i[i_SIZE_ICN][3] * q_i+1;
Name->pq[2] = Name->pq[0] + P_i[i_SIZE_ICN][2] * 8 - 2;
Name->pq[3] = Name->pq[1] + P_i[i_SIZE_ICN][3] - 2;
Name->next = &Name[1];
return(Name->next);
}
NAME *set_name_p(NAME *Name, int menu_i)/*et*/
{
int len, wid, half, add=0;
Name->key = G_mn[menu_i].key;
Name->n = menu_i;
do {
switch(menu_i) {
case mn_UP:
case mn_LT:
case mn_C_EE:
case mn_C_SS:
case mn_FR:
wid = 0;
len = 4;
half = 0;
break;
case mn_S_UP:
case mn_S_LT:
case mn_S_FR:
wid = 4;
len = 3;
half = 4;
break;
case mn_S_DN:
case mn_S_RT:
case mn_S_BK:
wid = 0;
len = 3;
half = 4;
break;
case mn_C_UP:
case mn_C_LT:
case mn_C_FR:
wid = 3;
len = 3;
half = 4;
break;
case mn_C_DN:
case mn_C_RT:
case mn_C_BK:
wid = 0;
len = 3;
half = 4;
break;
case mn_FF:
Name->pq[0] = G_mn[menu_i].p - 1;
Name->pq[1] = G_mn[menu_i].q;
Name->pq[2] = G_mn[menu_i].p + 7;
Name->pq[3] = 399;
continue;
break;
case mn_POS:
case mn_RND:
wid = 0;
half = -3;
len = 1;
add = 3;
break;
case mn_RET:
case mn_C_MM:
Name->pq[0] = G_mn[menu_i].p-14;
Name->pq[1] = G_mn[menu_i].q-13;
Name->pq[2] = G_mn[menu_i].p+22;
Name->pq[3] = G_mn[menu_i].q+5;
continue;
case mn_S_RET:
Name->pq[0] = G_mn[menu_i].p-4;
Name->pq[1] = G_mn[menu_i].q+4;
Name->pq[2] = G_mn[menu_i].p+22;
Name->pq[3] = G_mn[menu_i].q+27;
continue;
case mn_MN_TT:
Name->pq[0] = 0;
Name->pq[1] = 0;
Name->pq[2] = 0;
Name->pq[3] = 0;
continue;
case mn_ERR:
Name->pq[0] = G_mn[menu_i].p - 1;
Name->pq[1] = G_mn[menu_i].q - 2;
Name->pq[2] = G_mn[menu_i].p + G_mn[menu_i].len*8 + 1;
Name->pq[3] = G_mn[menu_i].q + 17;
continue;
default:
wid = 0;
len = G_mn[menu_i].len;
half = 0;
break;
}
Name->pq[0] = G_mn[menu_i].p + wid*8 - 1 + half + add;
Name->pq[1] = G_mn[menu_i].q;
Name->pq[2] = G_mn[menu_i].p + wid*8 + len*8 + 1 + half;
Name->pq[3] = G_mn[menu_i].q+16;
} while (0);
Name->next = &Name[1];
return(Name->next);
}
NAME *set_nb_name(NAME *Name, int i)/*et*/
{
G_nb.mn++;
return(Name);
}
NAME *find_key(int key)/*et*/
{
NAME *Name;
for (Name=G_mn[G_nb.mn].name; Name->key!=key && Name->next; Name=Name->next)
;
return((Name->key == key) ? Name : NULL);
}
NAME *find_n(int menu_i)/*et*/
{
NAME *Name;
for (Name=G_mn[G_nb.mn].name; Name->n!=menu_i && Name->next; Name=Name->next)
;
return((Name->n == menu_i) ? Name : NULL);
}
NAME *find_pq(int p, int q)/*et*/
{
NAME *Name;
for (Name = G_mn[G_nb.mn].name; Name->next; Name = Name->next)
if (p > Name->pq[0])
if (p < Name->pq[2])
if (q > Name->pq[1])
if (q < Name->pq[3])
return(Name);
return(NULL);
}